package com.gzx.risk.app.config;


import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.time.Duration;

@Configuration
public class RedissonConfig {
    // 读取 application.yml 中的 Redis 配置
    @Value("${spring.data.redis.host:127.0.0.1}")
    private String host;

    @Value("${spring.data.redis.port:6379}")
    private int port;

    @Value("${spring.data.redis.password:}")
    private String password;

    @Value("${spring.data.redis.database:0}")
    private int database;

//    @Value("${spring.data.redis.timeout:3000}")
    // 将 int 改为 Duration，接收带单位的配置（如 "10s"）
    @Value("${spring.redis.timeout:PT3S}") // 默认 3 秒（PT3S 是 Duration 的默认格式）
    private Duration timeout;

    // 连接池配置（可选，按需调整）
    @Value("${redisson.pool.min-idle:5}")
    private int minIdle;

    @Value("${redisson.pool.max-idle:10}")
    private int maxIdle;

    @Value("${redisson.pool.max-active:200}")
    private int maxActive;

    @Value("${redisson.pool.max-wait:3000}")
    private int maxWait; // 连接池最大阻塞等待时间（毫秒）

    @Bean(destroyMethod = "shutdown") // 容器销毁时关闭 RedissonClient，释放资源
    public RedissonClient redissonClient() {
        Config config = new Config();

        // 1. 单节点 Redis 配置（最常用，适配你的基础场景）
        config.useSingleServer()
                .setAddress("redis://" + host + ":" + port)
                .setPassword(password.isEmpty() ? null : password)
                .setDatabase(database)
                // 关键：将 Duration 转为毫秒数（Redisson 需要毫秒）
                .setTimeout((int) timeout.toMillis())
                .setConnectTimeout((int) timeout.toMillis())
                .setConnectionMinimumIdleSize(minIdle)
                .setConnectionPoolSize(maxActive);

        // 2. 若为 Redis 集群/哨兵模式，替换为以下配置（按需选择）
        // 集群模式示例：
        // config.useClusterServers()
        //       .addNodeAddress("redis://127.0.0.1:6379", "redis://127.0.0.1:6380")
        //       .setPassword(password)
        //       .setScanInterval(2000); // 集群节点扫描间隔（毫秒）

        // 哨兵模式示例：
        // config.useSentinelServers()
        //       .setMasterName("mymaster")
        //       .addSentinelAddress("redis://127.0.0.1:26379", "redis://127.0.0.1:26380")
        //       .setPassword(password);

        // 构建并返回 RedissonClient 实例
        return Redisson.create(config);
    }
}
